/*
 * Copyright (c) 2014 pkzd/1.0, 颜文泽(robin)
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     1 Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     2 Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include	<param.h>

.code16
.globl _start
_start:
	pushl   %ebp
        movl    $MEM_CNT, %ebp
        movl    $0, (%ebp)
        xorl    %ebx, %ebx 
        movw    $MEM_ADDR, %di 
mem0xe820:
        movl    $0xe820, %eax 
        movl    $MEM_MAP, %ecx 
        movl    $0x534d4150, %edx
        int     $0x15
        jc      setA20
        cmpl    $0x0, %ebx
        jz      setA20
        incl    (%ebp)	
        addw    $0x14, %di
        jmp     mem0xe820
setA20:	
        popl    %ebp
        cli
	call	wait_keyboard_inputbuffer_empty
	movb	$0xd1, %al
	outb	%al, $KEYBD_GATE1
	call	wait_keyboard_inputbuffer_empty
	movb	$0xdf, %al
	outb	%al, $KEYBD_GATE1
	lgdt    gdtr
        movl    %cr0, %eax
        orl     $CR0_PE, %eax
        movl    %eax, %cr0
        ljmp    $KERN_CSEL, $start32
wait_keyboard_inputbuffer_empty:
	inb	$KEYBD_GATE1, %al
	testb 	$0x02, %al
	jnz	wait_keyboard_inputbuffer_empty	
	ret
.code32
.globl start32
start32:
	movw	$(KERN_DSEL), %ax	
	movw	%ax, %ds
	movw	%ax, %ss
	movw	%ax, %es
	call	setparam
spin:
	jmp	spin

.align 32
gdt:
        .word   0x0000, 0x0000, 0x0000 ,0x0000
        .word   0xffff, 0x0000, 0x9a00, 0x00cf
        .word   0xffff, 0x0000, 0x9200, 0x00cf
gdtr:
        .word (. - gdt -1)
        .long   gdt
